package com.hb.G_协程.B_提取函数重构

import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking


/**
 * 我们来将 launch { …… } 内部的代码块提取到独立的函数中。
 * 当你对这段代码执行“提取函数”重构时，你会得到一个带有 suspend 修饰符的新函数。
 * 这是你的第一个挂起函数。在协程内部可以像普通函数一样使用挂起函数， 不过其额外特性是，
 * 同样可以使用其他挂起函数（如本例中的 delay）来挂起协程的执行。
 */
fun main() = runBlocking {
    launch { doWorld() }
    println("Hello,")
}
// 这是第一个挂起函数
suspend fun doWorld() {
    delay(1000L)
    println("World!")
}

/**
 *
 * 但是如果提取出的函数包含一个在当前作用域中调用的协程构建器的话，该怎么办？
 * 在这种情况下，所提取函数上只有 suspend 修饰符是不够的。为 CoroutineScope 写一个 doWorld 扩展方法是其中一种解决方案，但这可能并非总是适用，
 * 因为它并没有使 API 更加清晰。惯用的解决方案是要么显式将 CoroutineScope 作为包含该函数的类的一个字段，
 * 要么当外部类实现了 CoroutineScope 时隐式取得。 作为最后的手段，可以使用 CoroutineScope(coroutineContext)，
 * 不过这种方法结构上不安全， 因为你不能再控制该方法执行的作用域。只有私有 API 才能使用这个构建器。
 * */